package com.lt.hello;

import com.lt.config.CorrelationDataExt;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 这个时候使用的其实是默认的直连交换机（DirectExchange）
 * DirectExchange 的路由策略是将消息队列绑定到一个 DirectExchange 上
 * 当一条消息到达 DirectExchange 时会被转发到与该条消息 routing key 相同的 Queue 上
 * 例如消息队列名为 “hello-queue”，则 routingkey 为 “hello-queue” 的消息会被该消息队列接收。
 *
 *
 * todo 应该重试5次后，不在投递， 1、记录到表中人工处理 2、发送的死信队列 3、发送的自定义队列
 * todo 每次发送都记录到表中，发生变化更改对应的状态
 *
 * @author lucine
 * @version 1.0 2021/6/20 14:20
 */
@RestController
public class HelloProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @RequestMapping("sendHello")
    public void  sendHelloMessage(String exchange,String id,String routingKey,int delayTime){

        Message message = new Message(id.getBytes());

        //id + 时间戳 全局唯一
        CorrelationDataExt correlationData = new CorrelationDataExt();
        correlationData.setId(System.nanoTime() + "");
        //发送消息时指定 header 延迟时间
        rabbitTemplate.convertAndSend(exchange, routingKey, message,
                new MessagePostProcessor() {
                    @Override
                    public Message postProcessMessage(Message message) throws AmqpException {
                        //设置消息持久化
                        message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
                        // 两种方式 均可
                        //message.getMessageProperties().setHeader("x-delay", "6000");
                        message.getMessageProperties().setDelay(delayTime);
                        return message;
                    }
                }, correlationData);
    }
}
